home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / x11 / strategy / xpat2-1.000 / xpat2-1 / xpat2-1.04 / src / r_Royal.c < prev    next >
C/C++ Source or Header  |  1994-04-22  |  3KB  |  96 lines

  1. /*****************************************************************************/
  2. /*                                         */
  3. /*                                         */
  4. /*    X patience version 2 -- module r_Royal.c                 */
  5. /*                                         */
  6. /*    Characteristics of the ``Royal Cotillion'' rules             */
  7. /*    written by Michael Bischoff (mbi@mo.math.nat.tu-bs.de)             */
  8. /*    see COPYRIGHT.xpat2 for Copyright details                 */
  9. /*                                         */
  10. /*                                         */
  11. /*****************************************************************************/
  12. #include "xpatgame.h"
  13.  
  14. static int Royal_valid(Cardindex srcind, Pileindex dstpile) {
  15.     int srcpile, dstcard, srccard;
  16.  
  17.     srcpile = getpile(srcind);
  18.     if (srcpile == dstpile)
  19.     return 0;
  20.     if (game.piletype[srcpile] == Stack)
  21.     return 0;
  22.     dstcard = EMPTY(dstpile) ? -1 : game.cards[game.ind[dstpile+1]-1];
  23.     srccard = game.cards[srcind];
  24.     switch (game.piletype[dstpile]) {
  25.     case Slot:    /* moves to Slot not allowed */
  26.     case Tmp:
  27.     case FacedownDeck:
  28.     return 0;
  29.     case FaceupDeck:
  30.     return game.piletype[srcpile] == FacedownDeck;
  31.     case Stack:
  32.     if (srcind != INDEX_OF_LAST_CARD(srcpile) || CARDS_ON_PILE(dstpile) == 13)
  33.         return 0;    /* only one card at a time, no overfull stacks */
  34.     if (SUIT(srccard) != SUIT(dstpile))
  35.         return 0;
  36.     if (EMPTY(dstpile))
  37.         return RANK(srccard) == dstpile/4;
  38.     return RANK(srccard) == (2 + RANK(
  39.           game.cards[INDEX_OF_LAST_CARD(dstpile)])) % 13;
  40.     }
  41.     return 0;
  42. }
  43.  
  44. static void Royal_newgame(void) {
  45.     int i;
  46.     /* specific part: one card on a stack, 3 on the talon (VDECK) */
  47.     for (i = 0; i < rules.numcards; ++i)
  48.     game.visible[i] = 1;            /* TODO */
  49.     for (i = 0; i <= rules.numstacks; ++i)
  50.     game.ind[i] = 0;
  51.     for (i = 0; i < rules.numslots; ++i)
  52.     game.ind[FIRST_SLOT+i+1] = (i+1) * (rules.faceup+rules.facedown);
  53.     for (i = LAST_SLOT+1; i < IDECK; ++i)
  54.     game.ind[i+1] = game.ind[i] + 1;    /* one card each tmp */
  55.     game.ind[IDECK+1] = rules.numcards;
  56. }
  57.  
  58. struct rules Royal_rules = {
  59.     "Royal Cotillion",    /* shortname */
  60.     NULL,    /* longname */
  61.     "rc",       /* abbrev */
  62.     6,        /* layout_hints */
  63.     DECK_SOURCE|DECK_VISIBLE|STACKS_MULTI|AUTOFILL_TMPS|KLONDIKE_DEAL,/* variant */
  64.     CUSTOM_SLOTS|CUSTOM_TMPS|CUSTOM_FACEUP|CUSTOM_FACEDOWN,    /* customizable */
  65.     0,        /* customized */
  66.     104,    /* numcards */
  67.     8,        /* numstacks */
  68.     3,        /* numslots */
  69.     12,        /* numtmps */
  70.     2,        /* numdecks */
  71.     13,        /* cards_per_color */
  72.     0,        /* numjokers */
  73.     {0, 0, 1, 0},/* param[0], param[1], param[2], param[3] */
  74.     0,        /* facedown */
  75.     3,        /* faceup */
  76.     0,        /* newgame_bits */
  77.     Royal_newgame,/* new_game */
  78.     NULL,    /* game_won */
  79.     NULL,    /* new_cards */
  80.     ES_NONE|US_NONE|MG_NONE|ST_ONE|DC_ALWAYS, /* move_bits */
  81.     NULL,    /* deal_cards */
  82.     NULL,    /* undeal_cards */
  83.     NULL,    /* stackable */
  84.     Royal_valid,/* movevalid */
  85.     NULL,    /* valid */
  86.     NULL,    /* relaxed_valid */
  87.     NULL,    /* good_hint */
  88.     NULL,    /* automove */
  89.     NULL,    /* score */
  90.     0,        /* maxscore */
  91.     {0, 0, 0, 0}, /* paramstring blocks */
  92.     0,        /* used */
  93.     NULL,    /* initfunc */
  94.     NULL,    /* local keyboard bindings */
  95. };
  96.